(*******************************************************************************
   Modulo: Estudiante
   Descripcion: programa que almacena los datos de los estudiantes presentes en 
   el archivo texto en un arreglo
   Autor: Jesús Reyes
   Fecha: 29/05/2012
 *******************************************************************************)

IMPLEMENTATION MODULE Tad_Estudiante;

FROM libc IMPORT exit, printf;
FROM MathLib0 IMPORT sqrt;
FROM FpuIO IMPORT WriteReal;
FROM StrIO IMPORT WriteString, WriteLn;
FROM Scan IMPORT OpenSource;
FROM NumberIO IMPORT ReadInt,WriteInt;
FROM FIO IMPORT OpenToRead,File,EOF,ReadString,Close;
FROM Storage IMPORT ALLOCATE, DEALLOCATE;
FROM DynamicStrings IMPORT String, Slice, CopyOut, Index, InitString, ConCat;
FROM StringConvert IMPORT StringToInteger, IntegerToString;
FROM Storage IMPORT ALLOCATE, DEALLOCATE;


TYPE Estudiante = POINTER TO Est;

TYPE Est = RECORD
      codigo: INTEGER;
      nombre: String;
      edad: INTEGER;
    END;
    

(*PROCEDURE Nuevo ():Estudiante;
VAR alumno:Estudiante;
BEGIN
        NEW(alumno);
        IF (alumno = NIL) THEN
		  RETURN NIL;
		END;
    RETURN alumno;

END Nuevo;*)

PROCEDURE Nuevo(codigo: INTEGER;nombre: String;edad: INTEGER):Estudiante;
VAR alumno:Estudiante;
BEGIN
        NEW(alumno);
        IF (alumno = NIL) THEN
		  RETURN NIL;
		END;
	alumno^.codigo := codigo;
	alumno^.nombre := nombre;
	alumno^.edad := edad;
	RETURN alumno;

END Nuevo;

PROCEDURE AsigCodigo (VAR alumno: Estudiante; codigo: INTEGER);

BEGIN

  alumno^.codigo := codigo;
  
END AsigCodigo;

PROCEDURE AsigNombre (VAR alumno: Estudiante; nombre: String);

BEGIN

  alumno^.nombre := nombre;
  
END AsigNombre;

PROCEDURE AsigEdad (VAR alumno: Estudiante; edad: INTEGER);

BEGIN

  alumno^.edad := edad;
  
END AsigEdad;

PROCEDURE GetCodigo (alumno: Estudiante) : INTEGER;
VAR x: INTEGER;

BEGIN

  x := alumno^.codigo;
  
  RETURN x;
  
END GetCodigo;

PROCEDURE GetNombre (alumno: Estudiante) : String;

VAR x: String;

BEGIN

  x := alumno^.nombre;
  
  RETURN x;
  
END GetNombre;

PROCEDURE GetEdad (alumno: Estudiante) : INTEGER;
VAR x: INTEGER;

BEGIN

  x := alumno^.edad;
  
  RETURN x;

END GetEdad;


PROCEDURE Carga(data:File) : Estudiante;

VAR alumno: Estudiante;
VAR valido: BOOLEAN;
VAR string,nombre : String;
VAR linea : ARRAY [0..200] OF CHAR;
VAR inic,fin,i : CARDINAL;
VAR codigo, edad : INTEGER;
BEGIN

	
	valido := TRUE;
	inic := 0;
	ReadString(data,linea);
	string := InitString(linea);
	fin := Index(string,":",inic);
	codigo:= StringToInteger(Slice(string,inic,fin),10,valido);
	inic := fin + 1;
	fin := Index(string,":",inic);
	nombre := Slice(string,inic,fin);
	inic := fin + 1;
	fin := 0;
	edad := StringToInteger(Slice(string,inic,fin),10,valido);
	alumno := Nuevo(codigo, nombre, edad);
	RETURN alumno;
	
END Carga;

PROCEDURE Imprimir(alumno: Estudiante);
VAR x : ARRAY [0..19] OF CHAR;
BEGIN
	WriteString('(');
	WriteString('Codigo:');
	WriteInt(GetCodigo(alumno),0);
	WriteString(',Nombre:');
	CopyOut(x,GetNombre(alumno));
	WriteString(x);
	WriteString(',Edad:');
	WriteInt(GetEdad(alumno),0);
	WriteString(')');
END Imprimir;

PROCEDURE ImprimirNombre(alumno: Estudiante);
VAR x: ARRAY [0..19] OF CHAR;
BEGIN
	CopyOut(x,GetNombre(alumno));
	WriteString(x);
END ImprimirNombre;

PROCEDURE EstudianteToString(alumno: Estudiante): String;
VAR info : String;
BEGIN
	info := InitString('');
	info:=ConCat(info,IntegerToString(GetCodigo(alumno),1,"",FALSE,10,FALSE));
	info:=ConCat(info,InitString(' '));
	info:=ConCat(info,GetNombre(alumno));
	RETURN info;
END EstudianteToString;

END Tad_Estudiante.
